const { program, Option } = require("commander");

/** choices用法，程序会自动检测输入选项是否存在，不存在则报错（程序自动检测选项参数合法性） */
program
  .addOption(
    new Option("-k, --kit <size>", "尺寸").choices(["small", "normal", "large"])
  )
  .action((v) => {
    // 错误示范 node ./addOption.js -s 12  输入的是非"small", "normal", "large"时 报错“error: option '-s, -save <size>' argument '12' is invalid. Allowed choices are small, normal, large.”
    // 正确 node ./addOption.js -s large  得到参数 { Save: 'large' }
    console.log("得到参数", v);
  })
  .parse();

/** 默认值用法，设置默认值时如果要得到默认值，执行命令时均不带选项名称 */
program
  .addOption(
    new Option("-s, --save [size]", "尺寸")
      .choices(["small", "normal", "large"])
      .default("small")
  )
  .action((v) => {
    // node ./addOption.js 不带选项名称时 得到参数 { save: 'small' }{ save: 'small' }
    console.log("得到参数", v, program.opts());
  })
  .parse();

/** 其他用法 */
program
  .addOption(new Option("-s, --secret").hideHelp()) // 帮助提示隐藏该选项
  .addOption(
    new Option("-t, --timeout <delay>", "timeout in seconds").default(
      60,
      "one minute"
    ) // 设置默认值
  )
  .addOption(
    new Option("-d, --drink <size>", "drink size").choices([
      "small",
      "medium",
      "large",
    ]) // 定义选项范围
  )
  .addOption(new Option("-p, --port <number>", "port number").env("PORT"))
  .addOption(
    new Option("--donate [amount]", "optional donation in dollars")
      .preset("20")
      .argParser(parseFloat) // 对输入结果做解析格式化操作
  )
  .addOption(
    new Option("--disable-server", "disables the server").conflicts("port") // 和选项port 互斥，不能连用如：node ./addOption.js --disable-server -p 30
  )
  .addOption(
    new Option("--free", "small drink included free ").implies({
      drink: "12",
    }) // 添加额外选项参数值
  )
  .action((v) => {
    console.log(v);
  })
  .parse();
